/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import java.util.ArrayList;
import java.util.Calendar;

import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.StyledEditorKit.BoldAction;

import com.toedter.calendar.JDateChooser;

import model.ClienteDAO;
import model.EventoDAO;
import model.bean.CardapioBean;
import model.bean.ClienteBean;
import model.bean.EmpresaBean;
import model.bean.EventoBean;
import view.VisualizarCliente;
import view.VisualizarEventoView;
import Utils.StringUtil;
import Utils.ValidaDados;

/**
 *
 * @author Danillo
 */
public class EventoController {
    
    /**
     * Cadastr o evento no banco se todos os dados estão preenchidos.
     * @param nome
     * @param endereco
     * @param complemento
     * @param cep
     * @param cidade
     * @param status
     * @param periodo
     * @param data
     * @param qtdPessoas
     * @param cliente
     * @param cardapio
     */
    public static void cadastrarEvento(String nome, String endereco, String complemento, String cep, String cidade, 
    								   String status, String periodo, String data, String qtdPessoas, String obs, ClienteBean cliente, 
    								   CardapioBean cardapio, JTabbedPane aba){
    	boolean hasError = hasError(nome, endereco, cep, cidade, periodo, data, qtdPessoas);
    	if(hasError){
    		String errorMsg = msgErro(nome, endereco, cep, cidade, periodo, data, qtdPessoas);
    		JOptionPane.showMessageDialog(null, errorMsg);
    		return;
    	}
    	if(EventoDAO.getCountEventosPorData(StringUtil.stringToCalendar(data)) > 3){
    		JOptionPane.showMessageDialog(null, "Data indisponivel");
    		return;
    	}
    	cep = cep.replace("-", "");

    	EventoBean evento = new EventoBean(nome, endereco, cep, cidade, status, periodo, complemento, obs, "", Integer.parseInt(qtdPessoas.trim()), StringUtil.stringToCalendar(data), cliente, cardapio);
    	if(EventoDAO.insertEvento(evento)){
			JOptionPane.showMessageDialog(null, "Evento cadastrado com sucesso");
			aba.setSelectedIndex(1);
			
    	}
    }
    
    /**
     * 
     * @param nome
     * @param endereco
     * @param cep
     * @param cidade
     * @param periodo
     * @param data
     * @param qtdPessoas
     * @return true if all the parameters is not empty
     */
    public static boolean hasError(String nome, String endereco, String cep, String cidade, 
			   						  String periodo, String data, String qtdPessoas){
    	if(nome.trim().isEmpty() || endereco.trim().isEmpty() || cep.trim().isEmpty() ||
    			cidade.isEmpty() || StringUtil.limpaData(data).trim().isEmpty() || qtdPessoas.trim().isEmpty() || Integer.parseInt(qtdPessoas) == 0){
    		return true;
    	}
    	if(!ValidaDados.validaData(data, "dd/MM/yyyy")){
    		return true;
    	}
    	return false;
    }

	public static String msgErro(String nome, String endereco, String cep,
			String cidade, String periodo, String data, String qtdPessoas) {
		String msg = "Dado(s) do evento obrigatório(s):";
		if (nome.trim().isEmpty()) {
			msg += "\nNome do evento";
		}
		if (endereco.trim().isEmpty()) {
			msg += "\nEndereço ";
		}
		if(StringUtil.limpaData(data).trim().isEmpty()){
			msg += "\nData";
		}
		if (StringUtil.limpaCep(cep).trim().isEmpty()) {
			msg += "\nCep ";
		}
		if (cidade.isEmpty()) {
			msg += "\nCidade ";
		}
		if (qtdPessoas.trim().isEmpty() || Integer.parseInt(qtdPessoas) == 0) {
			msg += "\nNumero de pessoas "; 
		}
		if(!ValidaDados.validaData(data, "dd/MM/yyyy")){
			msg = "Data inválida.";
		}
		return msg;
	}
	public static void pesquisar(String nome, String cliente, String endereco,
			String dataInicio, String dataFim, JTable tabela) {

		ArrayList<Object> tabelaEvento = EventoDAO.pesquisarEvento(nome,
				cliente, endereco, dataInicio, dataFim);

		if (!tabelaEvento.isEmpty()) {
			Object[] columnNames = { "Código", "Cliente", "Nome", "Endereço","Periodo", "Situação", "Data"};
			DefaultTableModel model = (DefaultTableModel) tabela.getModel();
			model.setColumnCount(((Object[]) tabelaEvento.get(0)).length);
			model.setRowCount(0);
			model.setColumnIdentifiers(columnNames);
			for (Object events : tabelaEvento) {
				model.addRow((Object[]) events);
			}
			tabela.setModel(model);
			tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
			tabela.getColumnModel().getColumn(0).setPreferredWidth(60);
			tabela.getColumnModel().getColumn(1).setPreferredWidth(180);
			tabela.getColumnModel().getColumn(2).setPreferredWidth(150);
			tabela.getColumnModel().getColumn(3).setPreferredWidth(220);
	        tabela.getColumnModel().getColumn(4).setPreferredWidth(65);
	        tabela.getColumnModel().getColumn(5).setPreferredWidth(100);
	        tabela.getColumnModel().getColumn(6).setPreferredWidth(92);
		} else {
			JOptionPane.showMessageDialog(null, "Nenhum dado encontrado!");
		}
	}

	public static EventoBean getEvento(int id) {
		return EventoDAO.getEventoPorId(id);
	}
	
	public static void montaTelaAlterar(int idEvento, JTable tabela){
			
			EventoBean evento = getEvento(idEvento);
			VisualizarEventoView tela = new VisualizarEventoView(null, true,  tabela);
			tela.txtCodigo.setText(""+evento.getIdEvento());
			tela.txtNomeEvento.setText(evento.getNome());
			tela.jdata.getDateEditor().setDate(evento.getData().getTime());
//			tela.ftxtData.setText(StringUtil.limpaData(StringUtil.calendarToString(evento.getData())));
			tela.cbxPeriodo.setSelectedItem(evento.getPeriodo());
			tela.txtQtdPessoas.setText(""+evento.getQtdPessoas());
			tela.txtEndereco.setText(evento.getEndereco());
			tela.txtComplemento.setText(evento.getComplemento());
			tela.txtCep.setText(evento.getCep());
			tela.txtCidade.setText(evento.getCidade());
			tela.txtNome.setText(evento.getCliente().getNome());
			tela.txtCpf.setText(evento.getCliente().getCpf());
			tela.txtEmail.setText(evento.getCliente().getEmail());
			tela.ftxtTelefone.setText(StringUtil.limpaTelefone(evento.getCliente().getTelefone()));
			if(evento.getCliente().getEmpresa() != null){
				tela.txtNomeEmpresa.setText(evento.getCliente().getEmpresa().getRazaoSocial());
				tela.txtCnpj.setText(evento.getCliente().getEmpresa().getCnpj());
			}
			tela.cbxStatus.setSelectedItem(evento.getStatus());
			tela.txtMotivo.setText("");
			if(evento.getStatus().equals("Cancelado")){
				tela.txtMotivo.setEditable(true);
				tela.txtMotivo.setText(evento.getMotivo());
			}
			tela.cbxCardapio.setSelectedItem(evento.getCardapio().getNome());
			tela.atxtObs.setText(evento.getObs());
			tela.getBtnEditar().setVisible(true);
			tela.setVisible(true);
		}
	public static void editaEvento(String idEvento, String nome, String endereco, String cep, String cidade, 
			String status, String periodo, String complemento, String obs, String qtdPessoas, String data, String cpf, String nomeCardapio, String motivo
			){
			boolean error = hasError(nome, endereco, cep, cidade, periodo, data, qtdPessoas);
			if(error){
				String msg = msgErro(nome, endereco, cep, cidade, periodo, data, qtdPessoas);
				JOptionPane.showMessageDialog(null, msg);
				return;
			}
			if(EventoDAO.getCountEventosPorData(StringUtil.stringToCalendar(data)) > 3){
	    		JOptionPane.showMessageDialog(null, "Data indisponivel");
	    		return;
	    	}
			if (status.equalsIgnoreCase("Cancelado")) {
				if(motivo.isEmpty()){
					JOptionPane.showMessageDialog(null, "Motivo é obrigatório para o cancelamento.");
					return;
				}
			}
			CardapioBean cardapio = CardapioController.getCardapioPorNome(nomeCardapio);
			ClienteBean cliente = ClienteController.getClientePorCpf(cpf);
			
			EventoBean evento = new EventoBean(nome, endereco, cep, cidade, status, periodo, complemento,
												obs, motivo, Integer.parseInt(qtdPessoas), StringUtil.stringToCalendar(data), cliente, cardapio);	
			evento.setIdEvento(Integer.parseInt(idEvento));
			if(EventoDAO.updateEvento(evento)){
				JOptionPane.showMessageDialog(null, "Evento alterado com sucesso!");
			}else{
				JOptionPane.showMessageDialog(null, "Ocorreu um erro ao alterar o evento, tente novamente.");
			}
	}
	public static void limpaTelaPesquisar(JTextField nomeEvento, JTextField nomeCliente, JDateChooser dataInicio, JDateChooser dataFim, JTextField endereco){
		nomeEvento.setText("");
		nomeCliente.setText("");
		((JTextField)dataInicio.getDateEditor().getUiComponent()).setText("");
		((JTextField)dataFim.getDateEditor().getUiComponent()).setText("");
		endereco.setText("");
	}
	public static void limpaTelaCadastrar(JTextField nomeCliente, JTextField cpf, JFormattedTextField telefone, JTextField email, JTextField razaoSocial,
										JTextField cnpj, JTextField nomeEvento, JComboBox status,JDateChooser data, JComboBox periodo,
										JTextField qtdPessoas,JTextField endereco, JFormattedTextField cep,JTextField complemento,JTextField cidade,
										JComboBox cardapio, JTextArea obs ){
		nomeCliente.setText("");
		cpf.setText("");
		email.setText("");
		telefone.setText("");
		razaoSocial.setText("");
		cnpj.setText("");
		nomeEvento.setText("");
		status.setSelectedIndex(0);
		((JTextField)data.getDateEditor().getUiComponent()).setText("");
		periodo.setSelectedIndex(0);
		qtdPessoas.setText("");
		endereco.setText("");
		cep.setText("");
		complemento.setText("");
		cidade.setText("");
		cardapio.setSelectedIndex(0);
		obs.setText("");
	
	}
	public static void janelaFechou(JTable tabela){
		pesquisar("", "", "", "", "", tabela);
	}
	
}
